WindowsでAWS CDK(Java)の開発環境を整えてみた
福岡オフィスの梶原です。 夏休みに、そこにAWS CDKがあるので、AWS CDKをやろうと思ったのですが、せっかくなのであまりサンプルのないJavaでやろうと開発環境を更新しようとしたのがきっかけです。
今回のゴールとしては、ほぼ何もない環境からAWS CDK(Java)でCDKのHelloWorldサンプルが実行できることを目指します。インストール手順は逐一は説明せずにポイントだけ記載していきます。またAWSCDKの実行環境の構築がメインですのでAWS CDK(Java)の中身の詳細については、別のエントリーで試したいと思います。
インストール方法としては、インストーラーが提供されているものは基本的にはインストーラーを使用しますが、各ソフトウェアの最新を使用したいなどあれば適時変更してください。(AWS 関連はアップデートがはやいので、インストーラはつかわずにpipインストールしてます) また、IDEや、ソフトウェアバージョンなどは、独断と偏見で選んでますので、ご容赦ください。
注:なお、AWS CDKのJavaサポートはDeveloper Previewとなりますので、正式リリースの際は変更があることをお含みおきください
使用するソフトウェアのバージョンとリンク集(ダウンロード先など)
Java関連
- Java JDK: Java SE 11.0.4 (LTS)
-
Maven: InteilliJに含まれるものを使用 ※Maven については、InteilliJにバンドルされるものを使用します https://maven.apache.org/
Node.js
- Node.js: 10.16.2
Python
- Python: 3.7.4
AWS関連
- AWS クラウド開発キット (AWS CDK)
- https://aws.amazon.com/jp/cdk/
-
AWS コマンドラインインターフェイス(AWS CLI)
-
AWS Toolkit for IntelliJ
- https://aws.amazon.com/jp/intellij/
その他
各種ソフトのインストール
※各種ソフトウェアのインストールパスはC:\
直下にインストール先を変更しています。
Python
- リンク先のダウンロードページからダウンロードしたファイル(
python-3.7.4.exe
)を起動し、インストールを実施します。
Add Pyhon to environment variable
をチェックしてPATHを通します。- ダウンロード先のパスは
C:\Python\Python37-32
に変更しています
- インストールが完了しましたら、コマンドプロンプトを起動してパスまたはバージョンが意図したものか確認します。
> python --version Python 3.7.4 > pip3 --version pip 19.0.3 from c:\python\python37-32\lib\site-packages\pip (python 3.7)
AWS CLI
- コマンドプロンプトから
pip
を使用してインストールを行います
> pip3 install awscli --upgrade
- インストールが完了しましたら、コマンドプロンプトを起動してパスまたはバージョンが意図したものか確認します
> aws --version aws-cli/1.16.220 Python/3.7.4 Windows/10 botocore/1.12.210
Java JDK
- リンク先のダウンロードページからダウンロードしたファイル(
jdk-11.0.4_windows-x64_bin.exe
)をインストール実施います。 -
環境変数を設定します。
- JAVA_HOME=C:\Java\jdk-11.0.4 - PATH=%JAVA_HOME%\bin
- インストールが完了しましたら、コマンドプロンプトを起動してパスまたはバージョンが意図したものか確認します。
> java --version java 11.0.4 2019-07-16 LTS Java(TM) SE Runtime Environment 18.9 (build 11.0.4+10-LTS) Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.4+10-LTS, mixed mode
Git
- ダウンロードした
Git-2.22.0-64-bit.exe
をインストールします。 インストールパスだけ変更します。
> git --version git version 2.22.0.windows.1
IntelliJ IDEA
- ダウンロードした
ideaIC-2019.2.exe
をインストールします。 インストールパスだけ'C:\JetBrains\IntelliJ IDEA Community Edition 2019.2'に変更します。
IntelliJ IDEA の日本語化
- ダウンロードした
pleiades-win.zip
を展開して、適用します。
MavenのPath設定
- IntelliJ IDEAにバンドルされているMavenを使用するので、パスを通します。
- PATH=C:\JetBrains\IntelliJ IDEA Community Edition 2019.2\plugins\maven\lib\maven3\bin
Node.jsのインストール
- ダウンロードした
node-v10.16.2-x64.msi
からインストールを行います。
> node --version v10.16.2 > npm --version 6.9.0
AWS CDK
- AWS CDKはnpmを使用してインストールを実施します。
> npm install -g aws-cdk > cdk --version 1.3.0 (build bba9914)
AWS CDKのHelloWorldサンプルを実行
Hello-Worldプロジェクトの作成
- IntelliJ IDEAを起動します。
-
プロジェクトの作成
- [バージョン管理からチェックアウト]を行います
- git リポジトリからサンプルをクローンします。 URLは下記のAWSのサンプルのURLを指定します https://github.com/aws-samples/aws-cdk-examples/
- 既存モデルからプロジェクトを作成するで'Maven'を選択
- 再帰的にプロジェクト選択するにチェック
- Mavenプロジェクトを自動的に検出するにチェック
- インポートするMavenプロジェクトの選択で2つのプロジェクトが選択されるかと思います
- 次へを選択し、プロジェクトを作成します。
- プロジェクトが作成されるとMavenの依存関係等が更新されます。
- 正常に終了するとhello-world, lambda-cronの2つのプロジェクトが作成されます。
CDKのコンパイル
- IntelliJ IDEA 内のターミナルから実行します。
C:\IdeaProjects\aws-cdk-examples\java\hello-world>mvn compile [INFO] Scanning for projects... [INFO] [INFO] --------------------< com.amazonaws.cdk:hello-cdk >--------------------- [INFO] Building hello-cdk 1.0.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-cdk --- [INFO] Using 'UTF-8' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory C:\IdeaProjects\aws-cdk-examples\java\hello-world\src\main\resources [INFO] [INFO] --- maven-compiler-plugin:3.7.0:compile (default-compile) @ hello-cdk --- [INFO] Changes detected - recompiling the module! [INFO] Compiling 4 source files to C:\IdeaProjects\aws-cdk-examples\java\hello-world\target\classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 2.291 s [INFO] Finished at: 2019-08-19T17:41:48+09:00 [INFO] ------------------------------------------------------------------------
CDKで作成されるCloudFormationの確認
C:\IdeaProjects\aws-cdk-examples\java\hello-world>cdk synth [INFO] Scanning for projects... [INFO] [INFO] --------------------< com.amazonaws.cdk:hello-cdk >--------------------- [INFO] Building hello-cdk 1.0.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-cdk --- Validating MyAutoScalingGroup... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.347 s [INFO] Finished at: 2019-08-19T17:49:09+09:00 [INFO] ------------------------------------------------------------------------ Resources: VPCB9E5F0B4: Type: AWS::EC2::VPC Properties: CidrBlock: 10.0.0.0/16 EnableDnsHostnames: true EnableDnsSupport: true InstanceTenancy: default Tags: - Key: Name Value: hello-cdk/VPC Metadata: aws:cdk:path: hello-cdk/VPC/Resource VPCPublicSubnet1SubnetB4246D30: Type: AWS::EC2::Subnet Properties: CidrBlock: 10.0.0.0/18 VpcId: Ref: VPCB9E5F0B4 AvailabilityZone: Fn::Select: - 0 - Fn::GetAZs: "" MapPublicIpOnLaunch: true Tags: - Key: Name Value: hello-cdk/VPC/PublicSubnet1 - Key: aws-cdk:subnet-name Value: Public - Key: aws-cdk:subnet-type Value: Public Metadata: aws:cdk:path: hello-cdk/VPC/PublicSubnet1/Subnet <<省略>>
CDKのデプロイ
※注意 deployを実施しますとAWSのリソースが作成されます。
> C:\IdeaProjects\aws-cdk-examples\java\hello-world>cdk deploy [INFO] Scanning for projects... [INFO] [INFO] --------------------< com.amazonaws.cdk:hello-cdk >--------------------- [INFO] Building hello-cdk 1.0.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-cdk --- Validating MyAutoScalingGroup... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.290 s [INFO] Finished at: 2019-08-19T17:43:25+09:00 [INFO] ------------------------------------------------------------------------ This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening). Please confirm you intend to make the following modifications: IAM Statement Changes ┌───┬────────────────────────────────────────────────┬────────┬─────────────────┬───────────────────────────────┬───────────────────────────────────────────────┐ │ │ Resource │ Effect │ Action │ Principal │ Condition │ ├───┼────────────────────────────────────────────────┼────────┼─────────────────┼───────────────────────────────┼───────────────────────────────────────────────┤ │ + │ ${MyAutoScalingGroup/Compute/InstanceRole.Arn} │ Allow │ sts:AssumeRole │ Service:ec2.${AWS::URLSuffix} │ │ ├───┼────────────────────────────────────────────────┼────────┼─────────────────┼───────────────────────────────┼───────────────────────────────────────────────┤ │ + │ ${MySinkQueue/Resource.Arn} │ Allow │ sqs:SendMessage │ Service:sns.amazonaws.com │ "ArnEquals": { │ │ │ │ │ │ │ "aws:SourceArn": "${Topic1}" │ │ │ │ │ │ │ } │ │ + │ ${MySinkQueue/Resource.Arn} │ Allow │ sqs:SendMessage │ Service:sns.amazonaws.com │ "ArnEquals": { │ │ │ │ │ │ │ "aws:SourceArn": "${Topic2}" │ │ │ │ │ │ │ } │ │ + │ ${MySinkQueue/Resource.Arn} │ Allow │ sqs:SendMessage │ Service:sns.amazonaws.com │ "ArnEquals": { │ │ │ │ │ │ │ "aws:SourceArn": "${Topic3}" │ │ │ │ │ │ │ } │ │ + │ ${MySinkQueue/Resource.Arn} │ Allow │ sqs:SendMessage │ Service:sns.amazonaws.com │ "ArnEquals": { │ │ │ │ │ │ │ "aws:SourceArn": "${Topic4}" │ │ │ │ │ │ │ } │ │ + │ ${MySinkQueue/Resource.Arn} │ Allow │ sqs:SendMessage │ Service:sns.amazonaws.com │ "ArnEquals": { │ │ │ │ │ │ │ "aws:SourceArn": "${Topic5}" │ │ │ │ │ │ │ } │ └───┴────────────────────────────────────────────────┴────────┴─────────────────┴───────────────────────────────┴───────────────────────────────────────────────┘ Security Group Changes ┌───┬─────────────────────────────────────────────────────────────┬─────┬────────────┬─────────────────┐ │ │ Group │ Dir │ Protocol │ Peer │ ├───┼─────────────────────────────────────────────────────────────┼─────┼────────────┼─────────────────┤ │ + │ ${MyAutoScalingGroup/Compute/InstanceSecurityGroup.GroupId} │ Out │ Everything │ Everyone (IPv4) │ └───┴─────────────────────────────────────────────────────────────┴─────┴────────────┴─────────────────┘ (NOTE: There may be security-related changes not in this list. See http://bit.ly/cdk-2EhF7Np) Do you wish to deploy these changes (y/n)? y hello-cdk: deploying... hello-cdk: creating CloudFormation changeset... 0/42 | 5:44:10 PM | CREATE_IN_PROGRESS | AWS::EC2::EIP | VPC/PublicSubnet1/EIP (VPCPublicSubnet1EIP6AD938E8) 0/42 | 5:44:10 PM | CREATE_IN_PROGRESS | AWS::SNS::Topic | Topic3 (Topic3DEAE47A7) 0/42 | 5:44:10 PM | CREATE_IN_PROGRESS | AWS::EC2::VPC | VPC (VPCB9E5F0B4) <<省略>> MyAutoScalingGroup/Compute/ASG (MyAutoScalingGroupComputeASG94DE51EF) 42/42 | 5:47:38 PM | CREATE_COMPLETE | AWS::CloudFormation::Stack | hello-cdk ✅ hello-cdk Stack ARN: arn:aws:cloudformation:ap-northeast-1:XXXXXXXXXXX:stack/hello-cdk/6a6d3600-c25d-11e9-a71e-0a4b1943673a
- 正常に終了しましたら、対象のAWS環境でリソースが作成されるので、確認します。
現時点ではJavaのサンプルのhello-worldプロジェクトをデプロイすると - VPC - Subnet - RouteTable - NatGateway - SecurityGroup - EIP - SNS(Topic) - SNS(Subscription) - SQS - AutoScalingGroup - IAM Role - EC2(AutoScalingにより作成されます)
などのリソースが作成されます。
AWS 環境の削除
AWS CDKの動作確認、リソースの作成確認等ができましたら、無駄な課金を防ぐためにリソースを削除します。こちらもAWS CDKより実施できます。
C:\IdeaProjects\aws-cdk-examples\java\hello-world>cdk destroy [INFO] Scanning for projects... [INFO] [INFO] --------------------< com.amazonaws.cdk:hello-cdk >--------------------- [INFO] Building hello-cdk 1.0.0 [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- exec-maven-plugin:1.6.0:java (default-cli) @ hello-cdk --- Validating MyAutoScalingGroup... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 6.136 s [INFO] Finished at: 2019-08-19T17:57:46+09:00 [INFO] ------------------------------------------------------------------------ Are you sure you want to delete: hello-cdk (y/n)? y hello-cdk: destroying... 0 | 5:57:56 PM | DELETE_IN_PROGRESS | AWS::EC2::Route | VPC/PublicSubnet2/DefaultRoute (VPCPublicSubnet2DefaultRouteB7481BBA) << 省略>> ✅ hello-cdk: destroyed
正常に終了しましたら、実際に作成されたAWSのリソースが削除されているか確認してください。
まとめ
AWS CDK(Java)を実行する環境ができましたので、使い慣れた言語でAWS CDKを使っていきたいと思います。 AWS CDK(Java)の実際のユースケースとしては、WebアプリケーションのバックエンドでのAWS環境の作成用途などで使えるケースも今後はでてくるかもしれません(現時点では開発者プレビューですので正式リリースの際は変更があることをお含みおきください) また、AWS CDK自体も開発者プレビューですが、AWS SDKのJava 2.0ともリソースの方法等が似ており、相互につかえそうな気がしています。 AWS CDK(Java)の中身については、今回は動作確認程度でしたので、次回以降Deepに潜っていきたいと思います。
参考
-
Example projects using the AWS CDK https://github.com/aws-samples/aws-cdk-examples/
-
AWS for Java Developers in 2019 https://anz-resources.awscloud.com/aws-summit-sydney-2019-build/aws-for-java-developers-in-2019-3
-
[AWS CDK] AWS CDK Intro Workshop for Java #reinvent https://dev.classmethod.jp/cloud/aws-cdk-intro-workshop-for-java-reinvent/